﻿package mess;


// import cont.*;
import scrn.*;
import core.*;


// =============================================== Текстовое сообщение в комнату
public class MessRoom extends Message {

//==================================================================== Константы
// Типы отправителей и получателей
public static final int FROM_ONE = 0; // Постоянный контакт
public static final int FROM_ME = 1; // Приват или отправитель - я
public static final int FROM_CACHE_OLD = 2; // Кеш, старый
public static final int FROM_CACHE_NEW = 3; // Кеш, новый
public static final int FROM_SERVER = 4; // От сервера

public static final int TAR_ALL = 0; // Общее
public static final int TAR_ONE = 1; // Постоянный контакт
public static final int TAR_CACHE_OLD = 2; // Кеш, старый
public static final int TAR_CACHE_NEW = 3; // Кеш, новый
public static final int TAR_IN_ROOM = 3; // Из списка комнаты, запрошенного ранее
public static final int TAR_ME_ALL = 4; // Мне, видимое всем
public static final int TAR_ME = 5; // Приват

// ======================================================== Локальные переменные
public int h = 0; // Часы
public int m = 0; // Минуты
public int day = 1; // День
public int mon = 1; // Месяц
public int year = -1; // Год
public int stat = 0; // Статус
public String text = ""; // Текст
public int fromType = FROM_ME; // Тип отправителя
public int fromNum; // Номер отправителя
public int tarType = -1; // Тип получателя
public int tarNum; // Номер получателя
public String fromCache; // Кешированный ник отправителя
public String tarCache; // Кешированный ник получателя
public String nicks; // Кешированный блок ников
public boolean fPrv = false; // Флаг привата


// Разметка
public int hTot = 0; // Общая высота сообщения в точках
public int[] res; // Результат разметки текста
public int rTot = 0; // Кол-во строк в сообщении
public int color = RoomCol.T_EMPTY; // Тип сообщения


// =============================================================== Инициализация
public MessRoom() {

	Clock.timeUpdate();
	h = Clock.timeH;
	m = Clock.timeM;
}


// Отправляемое по умолчанию
public MessRoom(int fromNum, String text) {

	Clock.timeUpdate();
	init(MessRoom.FROM_ME, fromNum, MessRoom.TAR_ALL, -1, Clock.timeH,
			Clock.timeM, 1, 1, -1, text, RoomCol.T_OUT);
}


public MessRoom(int fromType, int fromNum, int tarType, int tarNum, int h,
		int m, String text, int color) {

	init(fromType, fromNum, tarType, tarNum, h, m, 1, 1, -1, text, color);
}


private void init(int fromType, int fromNum, int tarType, int tarNum, int h,
		int m, int day, int mon, int year, String text, int color) {

	this.h = h;
	this.m = m;
	this.day = day;
	this.mon = mon;
	this.year = year;
	this.text = text;
	this.fromType = fromType;
	this.fromNum = fromNum;
	this.tarType = tarType;
	this.tarNum = tarNum;
	this.color = color;
}


// ======================================== Создать копию входящего для отправки
public MessRoom copyIn2Out() {

	MessRoom messCopy = new MessRoom();

	messCopy.fromType = FROM_ME;

	switch (this.fromType) { // Тип отправившего контакта
		case MessRoom.FROM_ONE:
			messCopy.tarType = MessRoom.TAR_ONE;
			messCopy.tarCache = fromCache;
			messCopy.tarNum = fromNum;
			break;
		case MessRoom.FROM_CACHE_OLD:
			messCopy.tarType = MessRoom.TAR_CACHE_OLD;
			messCopy.tarCache = fromCache;
			messCopy.tarNum = fromNum;
			break;
		case MessRoom.FROM_ME:
		case MessRoom.FROM_SERVER:
			messCopy.tarType = MessRoom.TAR_ALL;
			messCopy.tarCache = "Всем: ";
			break;
	}

	messCopy.color = RoomCol.T_OUT;

	return messCopy;
}


//====================================================== Вернуть ник отправителя
public String getFrom(int length) {

	// length - максимальная возвращаемая длина. 0 - весь ник
	String name;
	switch (fromType) {
		case FROM_ONE:
		case FROM_CACHE_OLD:
			name = fromCache;
			break;
		case FROM_ME:
			name = Setting.login;
			break;
		case FROM_SERVER:
			name = Setting.servName;
			break;
		default:
			name = "???";
			Mess.err("MessRoom.parseAll", "Неизвестный тип отправителя " + fromType);
	}

	if (length > 0) {
		name = name.substring(0, Math.min(length, name.length()));
	}

	return name;
}


// ========================================================= Время в виде строки
public String getTimeString() {

	StringBuffer time = new StringBuffer();
	if (h < 10) {
		time.append('0');
	}
	time.append(h).append(':');
	if (m < 10) {
		time.append('0');
	}
	time.append(m);
	return time.toString();
}


// ========================================================== Разметка сообщения
public void parse(int textW) {

	StringBuffer nicks = new StringBuffer(32);

	try {
		synchronized (Man.main) {
			Man.par.reset(textW);
			Man.par.addTime();

			switch (fromType) {
				case FROM_ONE:
				case FROM_CACHE_OLD:
					//					Man.par.addNickFrom(fromCache);
					nicks.append(fromCache);
					break;
				case FROM_ME:
					//					Man.par.addMe();
					nicks.append(Setting.login);
					break;
				case FROM_SERVER:
					//					Man.par.addServ();
					nicks.append(Setting.servName);
					break;
				default:
					Mess.m("MessRoom.parse", "Неизвестный тип отправителя " + fromType);
					nicks.append("?");
			}

			switch (tarType) {
				case TAR_ALL:
					break;
				case TAR_ONE:
				case TAR_CACHE_OLD:
				case TAR_IN_ROOM:
					//					Man.par.addInick();
					//					Man.par.addNickTar(tarCache);
					nicks.append(Setting.inick).append(tarCache);
					break;
				case TAR_ME:
				case TAR_ME_ALL:
					//					Man.par.addInick();
					//					Man.par.addMe();
					nicks.append(Setting.inick).append(Setting.login);
					break;
				default:
					Mess.m("MessRoom.parse", "Неизвестный тип получателя " + tarType);
					nicks.append("?");
			}

			nicks.append(Setting.nickEnd);
			this.nicks = nicks.toString();
			Man.par.addNicks(this.nicks);

			Man.par.addText(text);

			// Забрать результаты
			this.res = Man.par.getRes();
			this.hTot = Man.par.hTot;
			this.rTot = Man.par.rTot;
		} // Освободить синхронизированный объект
	} catch (Exception e) {
		Mess.err("MessRoom.parse", e);
	}
}


// ========================================================= Отображение текстом
public String toString() {

	return "" + h + ":" + m + " " + day + "." + mon + "." + year + " stat="
			+ stat + " fromType=" + fromType + " fromNum=" + fromNum + " fromCache="
			+ fromCache + " tarType=" + tarType + " tarNum=" + tarNum + " tarCache="
			+ tarCache + " hTot=" + hTot + " rTot=" + rTot + " color=" + color
			+ " text: " + text;
}
}
